package com.hongshu.idle.config;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.hongshu.idle.domain.dto.AlipayConfigDTO;
import com.hongshu.idle.service.sys.ISysSystemConfigService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

/**
 * @author hongshu
 */
//@Configuration
//@Slf4j
//@Data
//public class AliPayConfig {
//
//    /**
//     * pid
//     */
//    @Value("${alipay.pid}")
//    String pid;
//
//    /**
//     * AppId
//     */
//    @Value("${alipay.appId}")
//    String appId;
//
//    /**
//     * 应用私钥
//     */
//    @Value("${alipay.merchantPrivateKey}")
//    String merchantPrivateKey;
//
//    /**
//     * 应用公钥
//     */
//    @Value("${alipay.alipayPublicKey}")
//    String alipayPublicKey;
//
//    /**
//     * 回调地址
//     */
//    @Value("${alipay.notifyUrl}")
//    String notifyUrl;
//
//    /**
//     * 返回地址
//     */
//    @Value("${alipay.returnUrl}")
//    String returnUrl;
//
//    /**
//     * 签名方式
//     */
//    @Value("${alipay.signType}")
//    String signType;
//
//    /**
//     * 字符编码格式
//     */
//    @Value("${alipay.charset}")
//    String charset;
//
//    /**
//     * 支付宝网关地址
//     */
//    @Value("${alipay.gatewayUrl}")
//    String gatewayUrl;
//
//
//    @Bean
//    public AlipayClient alipayClient() {
//        return new DefaultAlipayClient(
//                gatewayUrl,
//                appId,
//                merchantPrivateKey,
//                "json",
//                charset,
//                alipayPublicKey,
//                signType
//        );
//    }
//}

@Configuration
@Slf4j
@Data
public class AliPayConfig {

    @Autowired
    private ISysSystemConfigService systemConfigService;


    private String pid;
    private String appId;
    private String merchantPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;
    private String returnUrl;
    private String signType;
    private String charset;
    private String gatewayUrl;
    private Boolean isEnabled;


    @PostConstruct
    public void loadConfigFromDatabase() {
        try {
            // 从数据库加载支付宝配置
            this.loadAlipayConfigs();
        } catch (Exception e) {
            log.error("从数据库加载支付宝配置失败", e);
            // 如果数据库加载失败，使用默认配置
//            this.loadDefaultConfigs();
        }
    }

    private void loadAlipayConfigs() {
        // 使用现有的getAlipayConfig方法获取配置
        AlipayConfigDTO alipayConfig = systemConfigService.getAlipayConfig();

        if (alipayConfig != null) {
            this.pid = alipayConfig.getPid();
            this.appId = alipayConfig.getAppId();
            this.merchantPrivateKey = alipayConfig.getMerchantPrivateKey();
            this.alipayPublicKey = alipayConfig.getAlipayPublicKey();
            this.notifyUrl = alipayConfig.getNotifyUrl();
            this.returnUrl = alipayConfig.getReturnUrl();
            this.signType = alipayConfig.getSignType();
            this.charset = alipayConfig.getCharset();
            this.gatewayUrl = alipayConfig.getGatewayUrl();
            this.isEnabled = alipayConfig.getIsEnabled();

            log.info("支付宝配置已从数据库加载完成");
        } else {
            log.warn("未找到支付宝配置，使用默认配置");
//            this.loadDefaultConfigs();
        }
    }

//    private void loadDefaultConfigs() {
//        // 从环境变量或默认配置加载
//        Environment env = SpringContextUtils.getBean(Environment.class);
//
//        this.pid = env.getProperty("alipay.pid", "");
//        this.appId = env.getProperty("alipay.appId", "");
//        this.merchantPrivateKey = env.getProperty("alipay.merchantPrivateKey", "");
//        this.alipayPublicKey = env.getProperty("alipay.alipayPublicKey", "");
//        this.notifyUrl = env.getProperty("alipay.notifyUrl", "");
//        this.returnUrl = env.getProperty("alipay.returnUrl", "");
//        this.signType = env.getProperty("alipay.signType", "RSA2");
//        this.charset = env.getProperty("alipay.charset", "UTF-8");
//        this.gatewayUrl = env.getProperty("alipay.gatewayUrl", "https://openapi.alipaydev.com/gateway.do");
//        this.isEnabled = false;
//
//        log.warn("使用默认配置加载支付宝服务");
//    }

    // 添加刷新配置的方法
    public void refreshConfig() {
        loadConfigFromDatabase();
    }

    @Bean
    public AlipayClient alipayClient() {
        if (isEnabled != null && isEnabled) {
            return new DefaultAlipayClient(
                    gatewayUrl,
                    appId,
                    merchantPrivateKey,
                    "json",
                    charset,
                    alipayPublicKey,
                    signType
            );
        } else {
            log.warn("支付宝未启用，AlipayClient不可用！");
            // 你可以选择抛异常，也可以返回一个mock对象，或者直接return null
            // return null; // 这样注入时会报错
            throw new IllegalStateException("支付宝未启用，AlipayClient不可用！");
        }
    }

    // 获取配置信息的方法（用于调试或验证）
    public Map<String, String> getConfigInfo() {
        Map<String, String> configInfo = new HashMap<>();
        configInfo.put("pid", pid);
        configInfo.put("appId", appId);
        configInfo.put("notifyUrl", notifyUrl);
        configInfo.put("returnUrl", returnUrl);
        configInfo.put("signType", signType);
        configInfo.put("charset", charset);
        configInfo.put("gatewayUrl", gatewayUrl);
        configInfo.put("isEnabled", String.valueOf(isEnabled));
        // 不包含敏感信息如私钥和公钥
        return configInfo;
    }
}
